package co.edu.udea.iw.tusanimes.dao.impl;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import co.edu.udea.iw.tusanimes.dao.UsuarioDao;
import co.edu.udea.iw.tusanimes.dao.exception.DAOException;
import co.edu.udea.iw.tusanimes.dto.Usuario;


/**
 * Implementaci�n de la Interfaz UsuarioDao
 * 
 * @author Johan Torres
 * @version 1.0
 */
public class UsuarioDaoImpl extends HibernateDaoSupport implements UsuarioDao {

	/**
	 * Registrar un nuevo usuario.
	 * 
	 * @param usuario
	 *            Usuario a registrar.
	 * @return Usuario registrado.
	 * @throws DAOException
	 */
	@Override
	public Usuario registrar(Usuario usuario) throws DAOException {
		Transaction tx = null;

		try {
			Session session = getSession();
			tx = session.beginTransaction();
			session.save(usuario);
			tx.commit();
		} catch (HibernateException e) {
			throw new DAOException();
		}
		return usuario;
	}

	/**
	 * Eliminar un usuario.
	 * 
	 * @param nombreDeUsuario
	 *            Nombre del usuario a Eliminar.
	 * @throws DAOException
	 */
	@Override
	public void eliminar(String nombreDeUsuario) throws DAOException {
		Session session = null;
		Transaction tx = null;
		Query query = null;
		String sql;
		try {
			sql = "delete from Usuario where nombreDeUsuario= :nombreDeUsuario";
			session = getSession();
			tx = session.beginTransaction();
			query = session.createQuery(sql);

			query.setString("nombreDeUsuario", nombreDeUsuario);
			query.executeUpdate();
			tx.commit();
		} catch (HibernateException e) {
			throw new DAOException();
		}
	}

	/**
	 * Actualizar los datos de un usuario.
	 * 
	 * @param usuario
	 *            Usuario a actualizar.
	 * @throws DAOException
	 */
	@Override
	public void actualizar(Usuario usuario) throws DAOException {
		Transaction tx = null;

		try {
			Session session = getSession();
			tx = session.beginTransaction();
			session.update(usuario);
			tx.commit();
		} catch (HibernateException e) {
			throw new DAOException();
		}
	}

	/**
	 * Buscar un usuario por el nombre.
	 * 
	 * @param nombre
	 *            Nombre de usuario a buscar.
	 * @return Usuario Retorna el Usuario buscado o null si este no existe.
	 * @throws DAOException
	 */
	@Override
	public Usuario buscarNombre(String nombre) throws DAOException {
		Usuario usuario = null;

		try {
			Session sesion = getSession();
			usuario = (Usuario) sesion.createCriteria(Usuario.class)
					.add(Restrictions.eq("nombreDeUsuario", nombre))
					.uniqueResult();
		} catch (HibernateException e) {
			throw new DAOException();
		}

		return usuario;
	}

	/**
	 * Buscar usuario por el correo.
	 * 
	 * @param correo
	 *            Correo del usuario a buscar.
	 * @return Usuario Retorna el Usuario buscado o null si este no existe.
	 * @throws DAOException
	 */
	@Override
	public Usuario buscarCorreo(String correo) throws DAOException {
		Usuario usuario = null;

		try {
			Session sesion = getSession();
			usuario = (Usuario) sesion.createCriteria(Usuario.class)
					.add(Restrictions.eq("correo", correo)).uniqueResult();
		} catch (HibernateException e) {
			throw new DAOException();
		}

		return usuario;
	}

}
